#include "bsp_wtn6.h"


/*语音模块测试
	WTN6_Init();
	WTN6_SetVolume(15);
	WTN6_PowerOn();
	WTN6_TellTimeByHour(1, true);
	WTN6_TellMeasurementRemind(18,59);
	WTN6_PutBackRemind();
	WTN6_PowerOn();
*/


/**************************************************** 
	端口初始化
****************************************************/
void WTN6_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	
  RCC_APB2PeriphClockCmd(WTN_RCC, ENABLE);	    
	GPIO_InitStructure.GPIO_Pin = WTN_CLK_PIN | WTN_DATA_PIN;              
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(WTN_PORT, &GPIO_InitStructure); 
	
	GPIO_InitStructure.GPIO_Pin = WTN_BUSY_PIN;              
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           
  GPIO_Init(WTN_PORT, &GPIO_InitStructure); 
	
	
	// 设置血糖提示
	//WTN6_SetVolume(14);
	//WTN6_TellMeasurementRemind(13,50);
}


/**************************************************** 
*模块名称:WTN6_SendData(uint8_t data) 
*功    能:实现二线串口通信函数 
*入    参:data 为发送数据 
*出    参: 
****************************************************/
void WTN6_SendData(uint8_t data)
{
	uint8_t S_DATA,B_DATA;
	WTN_CLK = 1;  					//时钟线
	WTN_DATA = 1;      			//数据线
	S_DATA = data; 
  WTN_CLK  = 0; 
	Delay_Us(1000);  				//推荐延时5ms
	B_DATA = S_DATA&0X01; 
	for(uint8_t j=0;j<8;j++) 
	{ 
		WTN_CLK = 0;// 拉低
		WTN_DATA = B_DATA;    //传输数据一位
		Delay_Us(50);  				//推荐延时300us 
		WTN_CLK    = 1;   		//拉高
		Delay_Us(50); 				//推荐延时300us 
		S_DATA = S_DATA>>1;       
		B_DATA = S_DATA&0X01;  
	}  
	WTN_DATA  = 1; 
	WTN_CLK = 1; 
	
	Delay_Us(1000);  				//推荐延时5ms
}

/****************************************************
延时命令
****************************************************/
void WTN6_AddDelay10Ms(uint8_t t)
{
		WTN6_SendData(CMD_DELAY);
		WTN6_SendData(t);
}


/****************************************************
停止播放当前音频
level:音量等级，只能在（0~15）范围内
****************************************************/
void WTN6_SetVolume(uint8_t level)
{
		WTN6_SendData(CMD_VOLUME_LEVEL1+level);
}



/****************************************************
循环播放当前音频
*****************************************************/
void WTN6_Loop(void)
{
		WTN6_SendData(CMD_LOOP);
}


/****************************************************
选择指定序号音频输出
****************************************************/
void WTN6_WriteOneAudio(uint8_t audio)
{
	WTN6_SendData(audio);
}

/****************************************************
插入一条音频命令，不打断正在播放的
****************************************************/
void WTN6_insertOneAudio(uint8_t audio)
{
		WTN6_SendData(CMD_CONTINUE);
		WTN6_SendData(audio);
}




/****************************************************
连续输出多个音频,len最大只能是10
****************************************************/
void WTN6_WriteMultipleAudio(uint8_t len, uint8_t *audioBuf)
{
	for(uint8_t i=0;i<(len>10?10:len);i++)
	{
		WTN6_SendData(CMD_CONTINUE);
		WTN6_SendData(audioBuf[i]);
	}
}



/****************************************************
整点报时（24小时制）
t:取值范围1~24
zhengFlag:结束时是否播“整”
****************************************************/
void WTN6_TellTimeByHour(int8_t t, bool zhengFlag)
{	        
	if(t<=12)			WTN6_insertOneAudio(AUDIO_SHANGWU);	  // 16: 上午
	else					WTN6_insertOneAudio(AUDIO_XIAWU);			// 17: 下午
	
	int8_t timeAbs = (t-12)>0?(t-12):t;
	if(timeAbs<10)				
	{
		if(timeAbs==2)		WTN6_insertOneAudio(AUDIO_LIANG);  					 // 数字2和两口语化处理
		else							WTN6_insertOneAudio(AUDIO_NUM_1+timeAbs-1);  // 音频标签是从1开始，减1是为了对齐
	}
	else if(timeAbs==10)	WTN6_insertOneAudio(AUDIO_SHI);
	else if(timeAbs>10)		
	{
		WTN6_insertOneAudio(AUDIO_SHI);
		WTN6_insertOneAudio(AUDIO_NUM_1-1+(timeAbs-10));			
	}	
	WTN6_insertOneAudio(AUDIO_DIAN);			// 点
	if(zhengFlag)			WTN6_insertOneAudio(AUDIO_ZHENG);			// 整
}


/****************************************************
血糖测量提醒
hh: 小时，24小时制，取值范围1~24
mm: 分，取值范围0~59
****************************************************/
void WTN6_TellMeasurementRemind(int8_t hh,int8_t mm)
{
	if(mm==0)		WTN6_TellTimeByHour(hh, true);
	else{
		// 小时部分
		WTN6_TellTimeByHour(hh, false); 
		// 分钟部分
		if(mm%10==0)  // 整10倍分钟数
		{
			int8_t timeTen = mm/10;
			if(timeTen>1)		WTN6_insertOneAudio(AUDIO_NUM_1+timeTen-1);  // 音频标签是从1开始，减1是为了对齐，此处为1时忽略不播
			WTN6_insertOneAudio(AUDIO_SHI);			// 十
		}else{     // 分钟数不是整十倍数
			if(mm<10)	 // 小于10	
			{
				WTN6_insertOneAudio(AUDIO_NUM_1-1+mm);			
			}else{    // 大于10
				int8_t timeTen = mm/10;
				if(timeTen>1)		WTN6_insertOneAudio(AUDIO_NUM_1+timeTen-1);  // 音频标签是从1开始，减1是为了对齐，此处为1时忽略不播
				WTN6_insertOneAudio(AUDIO_SHI);			// 十
				WTN6_insertOneAudio(AUDIO_NUM_1-1+(mm%10));			
			}	
		}
		WTN6_insertOneAudio(AUDIO_FEN);			// 分
	}
	WTN6_AddDelay10Ms(40);  // 断句延时
	WTN6_insertOneAudio(AUDIO_MEASUREMENT);  // 请根据医嘱测量您的血糖哦
}


/****************************************************
血糖仪放回提醒
****************************************************/
void WTN6_PutBackRemind(void){
	WTN6_insertOneAudio(AUDIO_PUT_BACK);
}

/****************************************************
开机提醒
****************************************************/
void WTN6_PowerOn(void){
	WTN6_insertOneAudio(AUDIO_PUT_WELCOME);
}


